#include "phone_matcher.h"
#include <gtest/gtest.h>
#include <sstream>
#include <memory>
using namespace matcher;

struct MatcherTestParam {
    std::string input_str;       // 待匹配的输入字符串
    std::string expected_output; // 预期的输出
};

class MatcherTest : public ::testing::TestWithParam<MatcherTestParam>{
  protected:
    std::unique_ptr<PhoneMatcher> phonematcher;
    std::ostringstream captured_output;         // 捕获cout输出
    std::streambuf* original_cout;              // 保存原始cout缓冲区
  public:
    //PhoneMatcher::PhoneMatcher(const std::string& input_data)
    void SetUp() override {
      const auto& param = GetParam();
      phonematcher = std::make_unique<PhoneMatcher>(param.input_str);    
      // 重定向cout到captured_output，用于捕获输出
      original_cout = std::cout.rdbuf();
      std::cout.rdbuf(captured_output.rdbuf());
    }
    void TearDown() override {
      std::cout.rdbuf(original_cout);
    }
};

TEST_P(MatcherTest, PhoneMatchTest) {
    const auto& param = GetParam();
    phonematcher->match();
    
    EXPECT_EQ(captured_output.str(), param.expected_output);
}

INSTANTIATE_TEST_SUITE_P(
    MatcherTests,
    MatcherTest,
    ::testing::Values(
      // 1. 标准国内手机号（无分隔符）
      MatcherTestParam{
        "13800138000",
        "match: 13800138000  pos: 0-10\n"
      },
      // 2. 带空格分隔的手机号
      MatcherTestParam{
        "138 0013 8000",
        "match: 138 0013 8000  pos: 0-12\n"
      },
      // 3. 带'-'分隔的手机号
      MatcherTestParam{
        "138-0013-8000",
        "match: 138-0013-8000  pos: 0-12\n"
      },
      // 4. 国际格式（+86无空格）
      MatcherTestParam{
        "+8613800138000",
        "match: +8613800138000  pos: 0-13\n"
      },
      // 5. 国际格式（+86带空格）
      MatcherTestParam{
        "+86 13800138000",
        "match: +86 13800138000  pos: 0-14\n"
      },
      // 6. 连续多个手机号（无分隔符）
      MatcherTestParam{
        "1380013800013912345678",
        "match: 13800138000  pos: 0-10\nmatch: 13912345678  pos: 11-21\n"
      },
      // 7. 无效手机号（第二位不符合3-9）
      MatcherTestParam{
        "12800138000",  // 第二位是'2'，不满足3-9
        ""  // 无匹配结果
      },
      // 8. 长度不足11位的手机号
      MatcherTestParam{
        "1380013800",   // 仅10位
        ""  // 无匹配结果
      },
      // 9. 手机号包含在其他字符中
      MatcherTestParam{
        "a13800138000b",  // 手机号在中间（索引1-11）
        "match: 13800138000  pos: 1-11\n"
      },
      // 10. 混合空格和'-'分隔
      MatcherTestParam{
        "138 0013-8000",
        "match: 138 0013-8000  pos: 0-12\n"
      },
      // 11. 连续空格（无效，触发重置）
      MatcherTestParam{
        "138  00138000",  // 两个连续空格（第二个空格会被判定为无效）
        ""  // 无匹配结果
      },
      // 12. 国际格式不完整
      MatcherTestParam{
        "+813800138000", 
        "match: 13800138000  pos: 2-12\n"  
      },
      // 13. 手机号位于字符串中间（含中文）
      MatcherTestParam{
        "联系我13912345678谢谢",  // 手机号从索引3开始（"联系我"占3个字符）每个中文字符占 3 个字节
        "match: 13912345678  pos: 9-19\n"
      },
      // 14. 多个带分隔符的手机号
      MatcherTestParam{
        "138 0013 8000 139-1234-5678",
        "match: 138 0013 8000  pos: 0-12\nmatch: 139-1234-5678  pos: 14-26\n"
        }      
    )
  );

